package com.eagle.tool;

import com.eagle.enitity.Student;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 这个例子是函数式编程中map方法的使用说明，并且在map方法没有之前的传统做法也一并写出，
 * 然后读者自行比较两种方法的优劣。
 * <p>
 * 个人观点:从下面的代码可以看出代码非常冗长，并且可读性不高。完全没有函数式编程代码简洁,可读性高
 *
 * @author qinlinsen
 */
public class MapTest1 {

    /**
     * 现在的需求是希望把{@link List<Student>} 中的
     * 姓名单独提取出来，形成一个新的list
     * 年龄提取出来,形成一个新的list
     * 地址提取出来,形成一个新的list
     */
    private static final List<Student> studentList = Arrays.asList(
            new Student("洪七公", 28, "丐帮"),
            new Student("黄老邪", 29, "桃花岛"),
            new Student("郭靖", 12, "蒙古"),
            new Student("张三丰", 30, "武当"),
            new Student("灭绝师太", 3, "峨眉山"),
            new Student("安迪", 32, "上海"));

    @Test
    public void testUseFunctionalWay() {
        //把姓名单独提取出来，形成一个新的list
        final List<String> nameList = studentList.stream()
                .map(Student::getName)
                .collect(Collectors.toList());

        //遍历姓名
        System.out.println("-------遍历姓名开始-----------");
        nameList.forEach(System.out::println);
        System.out.println("-------遍历姓名结束-----------");

        ////把年龄单独提取出来，形成一个新的list
        final List<Integer> ageList = studentList.stream()
                .map(Student::getAge)
                .collect(Collectors.toList());

        System.out.println("-------遍历年龄开始-----------");
        nameList.forEach(System.out::println);
        System.out.println("-------遍历年龄结束-----------");

        //把地址单独提取出来，形成一个新的list
        final List<String> addressList = studentList.stream()
                .map(Student::getAddress)
                .collect(Collectors.toList());
        System.out.println("-------遍历地址开始-----------");
        nameList.forEach(System.out::println);
        System.out.println("-------遍历地址结束-----------");
    }


    /**
     * 用传统方式只演示一个例子：即 把姓名单独提取出来，形成一个新的list
     */
    @Test
    public void testUseTraditionalWay() {

        final List<String> nameList = new ArrayList<>();
        for (Student student : studentList) {
            nameList.add(student.getName());
        }

        //遍历姓名
        System.out.println("-------遍历姓名开始-----------");
        for (String name : nameList) {
            System.out.println(name);
        }
        System.out.println("-------遍历姓名结束-----------");
    }


}
